home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 039a / mawk10.zip / REARGV.C < prev    next >
C/C++ Source or Header  |  1991-10-05  |  2KB  |  83 lines

  1.  
  2. /*  reargv.c
  3.     --  set arguments via POLYSHELL
  4.     --  no errors, don't change anything if
  5.     --  it seems shell is not activated   */
  6.  
  7. /* POLYSHELL puts the shell expanded command line
  8.    in the environment variable CMDLINE.  Ascii 0 is
  9.    replaced by \xff.
  10. */
  11.  
  12. char *strchr(char *, int), *getenv(char *) ;
  13. char *basename(char *) ;
  14. void *malloc(unsigned) ;
  15. int  strcmp(char *, char *) ;
  16.  
  17. static  char *basename(char *s)
  18. /* strip path and extension , upcase the rest */
  19.   register char *p ;
  20.  
  21.   for ( p = strchr(s,0) ; p > s ; p-- )
  22.     switch( p[-1] )
  23.      { case '\\' :
  24.        case ':'  :
  25.        case '/'  :  return p ;
  26.        case '.'  :  p[-1] = 0 ;  break ;
  27.        default   :
  28.         if ( p[-1] >= 'a' && p[-1] <= 'z' )   p[-1] -= 32 ;
  29.         break ;
  30.      }
  31.  
  32.   return  p ;
  33. }
  34.  
  35. /*---------------------
  36.   reargv  --  recompute  argc and argv for PolyShell
  37.     if not under shell do nothing
  38.  *-------------------------------  */
  39.  
  40. extern  char *progname ;
  41. extern  unsigned char _osmajor ;
  42.  
  43. void  reargv(int *argcp , char ***argvp)
  44. { register char *p ;
  45.   char **v , *q, *cmdline, **vx ;
  46.   int cnt, cntx ;
  47.  
  48.   if ( _osmajor == 2 )  /* ugh */
  49.      (*argvp)[0] = progname ;
  50.   else { (*argvp)[0] = basename( (*argvp)[0] ) ;
  51.      progname = (*argvp)[0] ; }
  52.  
  53.   if ( ! (cmdline = getenv("CMDLINE")) )  return ;
  54.  
  55.   if ( *(q = strchr(cmdline,0) - 1) != 0xff )
  56.       return ;  /*  shexpand set wrong */
  57.  
  58.   for ( *q = 0, cnt = 1 , p = cmdline ; p < q ; p++ )
  59.      if ( *p == 0xff ) { cnt++ ; *p = 0 ; }
  60.  
  61.   if ( ! (v = (char **) malloc((cnt+1)*sizeof(char*))) )
  62.        return ;  /* shouldn't happen */
  63.  
  64.   p = cmdline ;
  65.   vx = v ; cntx = cnt ;
  66.   while ( cnt )
  67.    { *v++ = p ;
  68.      cnt-- ;
  69.      while ( *p )  p++ ;
  70.      p++ ;
  71.    }
  72.   *v = (char *) 0 ;
  73.   v = vx ;
  74.  
  75.   v[0] = basename( v[0] ) ;
  76.   if ( strcmp(v[0], (*argvp)[0]) )  return  ;/* running under command
  77.     and sh earlier  */
  78.   /* running under PolyShell  */
  79.   *argcp = cntx ;  *argvp = v ;
  80.   progname = v[0] ;
  81. }
  82.